package com.dongrj.framework.web;

import com.dongrj.framework.core.model.BaseExample;
import com.dongrj.framework.core.model.BaseModel;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author dongrongjun
 * @date 2020/08/04
 */
public interface BaseMapper<Model extends BaseModel<T>, ModelExample extends BaseExample, T> {

    /**
     * 根据Example查询总共条数
     *
     * @param example Example
     * @return 总条数
     */
    long countByExampleSelective(ModelExample example);

    /**
     * 根据Example删除记录
     *
     * @param example Example
     * @return 被删除的记录条数
     */
    int deleteByExample(ModelExample example);

    /**
     * 根据主键删除记录
     *
     * @param id 主键
     * @return 被删除的记录条数
     */
    int deleteByPrimaryKey(T id);

    /**
     * 添加实体
     *
     * @param record 实体
     * @return 被添加的记录条数
     */
    int insert(Model record);

    /**
     * 添加实体(排除控制)
     *
     * @param record 实体
     * @return 被添加的记录条数
     */
    int insertSelective(Model record);

    /**
     * 根据Example查询
     *
     * @param example Example
     * @return 符合条件的实体集合
     */
    List<Model> selectByExampleSelective(ModelExample example);

    /**
     * 根据主键返回记录
     *
     * @param id      主键
     * @param columns 实体列
     * @return 实体
     */
    Model selectByPrimaryKey(@Param("id") T id, @Param("columns") List<String> columns);


    /**
     * 根据ID集合批量查询数据
     *
     * @param ids     ID集合
     * @param columns 查询字段集合
     */
    List<Model> selectByBatchIdPrimaryKey(@Param("ids") List<T> ids, @Param("columns") List<String> columns);


    /**
     * 根据ID集合批量删除数据
     *
     * @param ids ID集合
     */
    int deleteByBatchIdPrimaryKey(@Param("ids") List<T> ids);

    /**
     * 根据Example修改实体(排除空)
     *
     * @param record  实体
     * @param example Example
     * @return 被修改的记录条数
     */
    int updateByExampleSelective(@Param("record") Model record, @Param("example") ModelExample example);


    /**
     * 根据Example修改实体(排除空)
     *
     * @param record  实体
     * @param example Example
     * @return 被修改的记录条数
     */
    int updateByPrimaryKeyColumnsSelective(@Param("record") Model record, @Param("example") ModelExample example);

    /**
     * 根据Example修改实体
     *
     * @param record  实体
     * @param example Example
     * @return 被修改的记录条数
     */
    int updateByExample(@Param("record") Model record, @Param("example") ModelExample example);

    /**
     * 根据实体主键修改(排除空)
     *
     * @param record 实体
     * @return 被修改的记录条数
     */
    int updateByPrimaryKeySelective(Model record);

    /**
     * 根据实体主键修改
     *
     * @param record 实体
     * @return 被修改的记录条数
     */
    int updateByPrimaryKey(@Param("record") Model record, @Param("example") ModelExample example);

    /**
     * 批量插入(排除空)
     *
     * @param records 实体集合
     * @return 被添加的记录数
     */
    int insertBatchSelective(List<Model> records);

    /**
     * 批量修改(排除空)
     *
     * @param records 实体集合
     * @return 被修改的记录数
     */
    int updateBatchByPrimaryKeySelective(List<Model> records);

}
